/*
 * UpgradeFile.cpp
 *
 *  Created on: 2024年3月28日
 *      Author: Admin
 */
#include "uart/upgradeFile.h"


#include <fstream>
#include <sstream>
using namespace std;

#define UPGPATH "mnt/extsd/TEST.UPG"
#define CMDID_ENABLE 0x81	//可以被升级
#define CMDID_DISABLE 0x82	//不可以被升级
static FILE* upgradeFile = nullptr;

UpgradeFile::UpgradeFile() {}

UpgradeFile::~UpgradeFile() {
	// TODO 自动生成的析构函数存根
}

UpgradeFile* UpgradeFile::getInstance(void)
{
	static UpgradeFile UPG;
	return &UPG;
}

bool UpgradeFile::IsFileExists(std::string path){
	if(!access(path.c_str(),F_OK)){
		LOGD_TRACE("--%d--,--%s--,文件存在:%s\n",__LINE__,__FILE__,path.c_str());
		return true;
	}else{
		LOGD_TRACE("--%d--,--%s--,文件不存在:%s\n",__LINE__,__FILE__,path.c_str());
		return false;
	}
}

void UpgradeFile::readyRead(){
	if(!IsFileExists(UPGPATH)){
		//mnt/extsd检测有没有对应文件，直接返回
		LOGD_TRACE("--%d--,--%s--,没有升级文件\n",__LINE__,__FILE__);
		return;
	}
	BYTE SendBuf[5];
	SendBuf[0]=0x01;
	SendBuf[1]=0x5E;
	SendBuf[2]=0x6A;
	SendBuf[3]=0xEA;
	SendBuf[4]=0x87;
	RESPONSE->sendData(0xD9, SendBuf, 5);
}

void UpgradeFile::ProcessUpgrade(const BYTE *pData){
	BYTE sendBuf[128];
	// CmdID
	switch (pData[0]) {
	case 0x01:	//请求升级
	{
		sendBuf[0] = 0x81;	//应答
		RESPONSE->sendData(0xD9, sendBuf, 1);
		break;
	}
	case 0x02:	//需要升级的文件数据字节长度
	{
		// 如果还没有打开文件，则打开它
		if (!upgradeFile) {
			upgradeFile = fopen("/mnt/extsd/TEST.UPG", "rb");
			if (!upgradeFile) {
				// 处理文件打开失败的情况
				return;
			}
		}
		uint32_t offset = 0;
		uint8_t byteLength = pData[1];
		// 计算数据偏移位置
		offset = (static_cast<uint32_t>(pData[2]) << 16) |
				 (static_cast<uint32_t>(pData[3]) << 8) |
				  static_cast<uint32_t>(pData[4]);

		// 移动文件指针到指定位置
		fseek(upgradeFile, offset, SEEK_SET);

		// 读取数据块
		size_t readBytes = fread(sendBuf + 4, 1, byteLength, upgradeFile);
		if (readBytes != byteLength) {
			// 处理读取错误或文件结束
			fclose(upgradeFile);
			upgradeFile = nullptr;
			return;
		}

		// 构建偏移位置数据（不包含CMD_HEAD1和DATATYPE_HOST）
		sendBuf[0] = 0x83;
		sendBuf[1] = (offset >> 16) & 0xFF;
		sendBuf[2] = (offset >> 8) & 0xFF;
		sendBuf[3] = offset & 0xFF;

		// 发送整个包，包括偏移位置和实际数据
		RESPONSE->sendData(0xD9, sendBuf, byteLength + 4);
		break;
	}
	case CMDID_ENABLE:	//可以
	{

		break;
	}
	case CMDID_DISABLE:	//不能升级
	{

		break;
	}
	case 0x83:	//当前升级进度
	{
		break;
	}
	case 0x84:	//升级失败 错误码
	{
		break;
	}
	case 0x86:	//IAP程序版本
	{
		break;
	}
	case 0x87:	//APP版本
	{
		break;
	}

	}

}
